package com.whfc.emp.service;

import com.whfc.common.result.PageData;
import com.whfc.emp.entity.ConfirmationRecord;
import com.whfc.entity.dto.Apply.rep.ArrivalConfirmationDTO;
import com.whfc.entity.dto.Apply.req.AppEntryApplicationReq;

import java.util.List;

/**
 * 确认记录服务接口，定义到场和离场确认相关的业务方法
 */
public interface ConfirmationRecordService {
    /**
     * 新增完整记录（所有字段）
     * @param record 确认记录实体
     * @return 影响行数
     */
    int addRecord(ConfirmationRecord record);

    /**
     * 选择性新增记录（仅插入非空字段）
     * @param record 确认记录实体
     * @return 影响行数
     */
    int addRecordSelective(ConfirmationRecord record);

    /**
     * 根据ID查询记录
     * @param id 主键ID
     * @return 确认记录实体
     */
    ConfirmationRecord getById(Integer id);

    /**
     * 根据计划ID查询记录
     * @param planId 关联的工作计划ID
     * @return 确认记录实体
     */
    ConfirmationRecord getByPlanId(Integer planId);

    /**
     * 根据确认人ID查询相关记录
     * @param confirmerId 确认人ID
     * @return 确认记录列表
     */
    List<ConfirmationRecord> getByConfirmer(Integer confirmerId);

    /**
     * 分页查询所有记录
     * @param pageNum 页码（从1开始）
     * @param pageSize 每页条数
     * @return 确认记录列表
     */
    PageData<ConfirmationRecord> getAllByPage(Integer planId, int pageNum, int pageSize);

    /**
     * 根据条件查询记录
     * @param record 包含查询条件的实体
     * @return 符合条件的记录列表
     */
    List<ConfirmationRecord> getByCondition(ConfirmationRecord record);

    /**
     * 处理到场确认（自动判断新增或更新）
     * @param record 包含到场确认信息的实体
     * @return 影响行数
     */
    int confirmArrival(ConfirmationRecord record);

    /**
     * 处理离场确认（需先有到场记录）
     * @param record 包含离场确认信息的实体
     * @return 影响行数
     */
    int confirmDeparture(ConfirmationRecord record);

    /**
     * 全量更新记录（所有字段均更新）
     * @param record 包含更新信息的实体
     * @return 影响行数
     */
    int updateRecord(ConfirmationRecord record);

    /**
     * 选择性更新记录（仅更新非空字段）
     * @param record 包含更新信息的实体
     * @return 影响行数
     */
    int updateRecordSelective(ConfirmationRecord record);

    /**
     * 根据ID删除记录
     * @param id 主键ID
     * @return 影响行数
     */
    int deleteById(Integer id);

    /**
     * 根据计划ID删除记录
     * @param planId 关联的工作计划ID
     * @return 影响行数
     */
    int deleteByPlanId(Integer planId);

    /**
     * 批量删除记录
     * @param ids 主键ID列表
     * @return 影响总行数
     */
    int batchDelete(List<Integer> ids);

    List<ArrivalConfirmationDTO> selectArrivalConfirmationList(AppEntryApplicationReq req);

    List<ArrivalConfirmationDTO> selectArrivalConfirmationExitList(AppEntryApplicationReq req);

}